﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SoftwareConsulting.BI11.NumericalMethods
{
    /// <summary>
    /// Делегат функции с двумя аргументами
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public delegate double FunctionWithTwoArguments(double x, double y);
    /// <summary>
    /// Делегат функции с одним аргументом
    /// </summary>
    /// <param name="x"></param>
    /// <returns></returns>
    public delegate double FunctionWithOneArgument(double x);

    /// <summary>
    /// Интерфейс одноаргументной функции
    /// </summary>
    public interface IOneVariableFunction
    {
        /// <summary>
        /// Возвращает значение функции при указанном аргументе
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        double GetValue(double x);
    }

    /// <summary>
    /// Интерфейс параметризированной одноаргументной функции
    /// </summary>
    public interface IParametrizedOneVariableFunction : IOneVariableFunction
    {
        /// <summary>
        /// Возвращает/устанавливает параметры функции
        /// </summary>
        double[] Parameters { get; set; }
        /// <summary>
        /// Возвращает значение функции и градиент функции с учетом параметров
        /// </summary>
        /// <param name="x"></param>
        /// <returns>0й элемент - значение функции, 1й и последующие - градиент функции</returns>
        double[] GetValueAndGradient(double x);
    }

    /// <summary>
    /// Интерфейс многоаргументной функции
    /// </summary>
    public interface IManyVariableFunction : IOneVariableFunction
    {
        /// <summary>
        /// Возвращает значение функции для указанного набора аргументов
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        double GetValue(params double[] x);
    }    
}
